package controllers

import (
	"github.com/gin-gonic/gin"
	"go_pure_admin_api/dto"
	"go_pure_admin_api/global"
	"go_pure_admin_api/models"
)

type MenuController struct {
	BaseController
}

// GetMenuList godoc
// @Summary 获取菜单列表
// @Description 获取菜单列表
// @Tags 菜单管理
// @Accept  json
// @Produce  json
// @Success 200 {object} ResponseJson
// @Router /menu/menuList [post]
func (m *MenuController) GetMenuList(c *gin.Context) {
	var menus models.Menus
	menuList, err := menus.GetAllMenusList()
	if err != nil {
		m.Fail(c, 500, "获取菜单列表失败:"+err.Error(), nil)
		return
	}
	m.Success(c, "获取菜单列表成功", menuList)
}

// CreateMenu godoc
// @Summary 创建菜单
// @Description 创建新菜单
// @Tags 菜单管理
// @Accept  json
// @Produce  json
// @Param data body dto.CreateMenuDto true "创建菜单参数"
// @Success 200 {object} ResponseJson
// @Router /menu/createMenu [post]
func (m *MenuController) CreateMenu(c *gin.Context) {
	var createMenu dto.CreateMenuDto
	if err := c.ShouldBindJSON(&createMenu); err != nil {
		m.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	menu := models.Menus{}
	err := menu.CreateMenu(createMenu)
	if err != nil {
		global.Logger.Errorf("来自用户%s创建菜单失败: %v", c.GetString("username"), err)
		m.Fail(c, 500, "创建菜单失败:"+err.Error(), nil)
		return
	}
	m.Success(c, "创建菜单成功", nil)
}

// UpdateMenu godoc
// @Summary 更新菜单
// @Description 更新菜单信息
// @Tags 菜单管理
// @Accept  json
// @Produce  json
// @Param data body dto.UpdateMenuDto true "更新菜单参数"
// @Success 200 {object} ResponseJson
// @Router /menu/updateMenu [post]
func (m *MenuController) UpdateMenu(c *gin.Context) {
	var updateMenu dto.UpdateMenuDto
	if err := c.ShouldBindJSON(&updateMenu); err != nil {
		m.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	menu := models.Menus{}
	err := menu.UpdateMenu(updateMenu)
	if err != nil {
		global.Logger.Errorf("来自用户%s更新菜单失败: %v", c.GetString("username"), err)
		m.Fail(c, 500, "编辑菜单失败:"+err.Error(), nil)
		return
	}
	m.Success(c, "编辑菜单成功", nil)
}

// DelMenu godoc
// @Summary 删除菜单
// @Description 删除指定菜单
// @Tags 菜单管理
// @Accept  json
// @Produce  json
// @Param data body dto.DelMenuByIDDto true "删除菜单参数"
// @Success 200 {object} ResponseJson
// @Router /menu/deleteMenu [post]
func (m *MenuController) DelMenu(c *gin.Context) {
	var delMenu dto.DelMenuByIDDto
	if err := c.ShouldBindJSON(&delMenu); err != nil {
		m.Fail(c, 400, "参数错误:"+err.Error(), nil)
		return
	}
	menu := models.Menus{}
	err := menu.DeleteMenuByID(delMenu.ID)
	if err != nil {
		global.Logger.Errorf("来自用户%s删除菜单失败: %v", c.GetString("username"), err)
		m.Fail(c, 500, "删除菜单失败:"+err.Error(), nil)
		return
	}
	m.Success(c, "删除菜单成功", nil)
}
